//P_: !!!1mFPSُɏオsAtitle,}EX|CgŋPx𕪂悤ɁAȂl摜JtHAt[YV{o
//v`FbNŏƍŌ̃t[͂ƂĂ邩Amin freeze frame numframe num/bin͊Ԉ̃t[A^CgɃsNZPx\


//  5 ͒ɃEBhEANeBuɂƑ
//l
//jpixelԊu4,15frameɉ͂
//ő4Ԃ̓悵͂łȂi܁icvgetavił548*15=8220t[܂łJȂ,111320t[,2frame/secȂ68.5͂łjŏԈgŉ
#packopt name "FreezeAnalyzer"	//st@Cõ͎t@Cw
#define ̓X^[g 1	//Pɂƃ}EXꂽォ̓X^[g
#include "hspcv.as"		//摜ȆpCu
#include "hspext.as"	//tH_Ip̃Cu
#include "user32.as"	//gOXCb`pCu
#include "hgimg3.as"	//p
#define HABA 405
#define TAKASA 595
=1
ʍX=100
ʍY=25
ob`Iʕ=1200
ob`Iʍ=1000
onexit *Exit
t[=0
̓t[=0	//͂t[̐
t[=0	//t[
PIt@C=""	//ꓮ͂̏ꍇ̑I於
̓[h=0
pX=""

FolderPath=""
ExpMozi=""					//GNX|[gpieLXgej	
tyokkei=15					//̒a(cm)	̂Ƃsgp
KaisekiFrame=600			//̓t[(720)
Result=""					//exportp

speedmode=0					//await邩ۂ
AviSizeX=320					//摋̃TCY
AviSizeY=240
Vtg=0
KaisekiFrameFromStart=0	//Đł͂Ȃ͂JnĂ珈t[
hidariue_x=84				//͔͈͕ێ
hidariue_y=38
migisita_x=257
migisita_y=191

dim atari,HABA,TAKASA	//̍WɃVOi邩
xAtariNum=0		//atarix̐
yAtariNum=0		//atariy̐
step=2			//sNZׂ̍(tailsuspention:2)
AtariHenka=0	//Oڰтœ肪ꏊɓ肪o
iro=0			//擾F

VideoDur=300
VideoFPS=30
BinDur=60
MinFreezeDur=2
AnalyzeFPS=15

FrameStep=15		//摜ڰіɉ͂邩(150.5b)
Threshold=45	//2l鎞臒l
臒l=50		//Ƃ݂ȂsNZ
ŏt[=4	//̐ȉ̖s͖ƌȂȂ
BinFrameNum=120	//Biñt[
NextTrg=0		//̃tF[YֈڂgK[
TenmetuTrg=1
TenmetuCnt=0
A=0
StartTrg=0
|CgPx=0	//}EXŃ|CgĂsNZ̋Px
ddim ,8220	//ebin̖
dim ,8220	//et[Ŗł̍ŏI 1Ȃ疳

sdim _O,10,999
sdim _ω,10,999
sdim _ݗ,10,999

ID=0

=1

ProgramPath=dir_cur	//svÕpXێ

select_hani=-1	//IĂg̔ԍ
select_ten=-1	//IĂ_i0@EPj

mx=0:my=0
pmx=0:pmy=0

exist "VideoDur.fa"
if strsize!=-1{
	bload "VideoDur.fa",VideoDur	//[h
}
exist "VideoFPS.fa"
if strsize!=-1{
	bload "VideoFPS.fa",VideoFPS	//[h
}
exist "BinDur.fa"
if strsize!=-1{
	bload "BinDur.fa",BinDur	//[h
}
exist "MinFreezeDur.fa"
if strsize!=-1{
	bload "MinFreezeDur.fa",ŏt[	//[h
}
exist "ColorThreshold.fa"
if strsize!=-1{
	bload "ColorThreshold.fa",Threshold	//[h
}
exist "MotionThreshold.fa"
if strsize!=-1{
	bload "MotionThreshold.fa",臒l	//[h
}
exist "AnalyzeFPS.fa"
if strsize!=-1{
	bload "AnalyzeFPS.fa",AnalyzeFPS	//[h
}
exist "AnalysisDensity.fa"
if strsize!=-1{
	bload "AnalysisDensity.fa",step	//[h
}
exist "Wait.fa"
if strsize!=-1{
	bload "Wait.fa",SaiseiSpeed	//[h
}

exist "ULX.fa"
if strsize!=-1{
	bload "ULX.fa",hidariue_x	//[h
}
exist "ULY.fa"
if strsize!=-1{
	bload "ULY.fa",hidariue_y	//[h
}
exist "BRX.fa"
if strsize!=-1{
	bload "BRX.fa",migisita_x	//[h
}
exist "BRY.fa"
if strsize!=-1{
	bload "BRY.fa",migisita_y	//[h
}
//____________________________________________________________________________________________________________͈͂͂w肳鏈


screen 0,AviSizeX,AviSizeY,0,100,25			//EBhE
screen 1,HABA,TAKASA,0,AviSizeX+520,20			//EBhE	120
title "Freeze analyzer"
buffer 2,AviSizeX,AviSizeY,0	//̍ŏ̃t[ێp
buffer 3,HABA,TAKASA,0	//ʃNAp
color 0,0,0
boxf 0,0,HABA,TAKASA	//œhׂ


Repeat	//C[v
	gosub *PutInputField
	Repeat	//͏ݒ胋[v
		gsel 0
		stick st,256
		select_hani=-1
		if st=256 & mx>hidariue_x-4 & my>hidariue_y-4 & mx<hidariue_x+4 & my<hidariue_y+4{
			select_hani=1
			select_ten=0
		}
		if st=256 & mx>migisita_x-4 & my>migisita_y-4 & mx<migisita_x+4 & my<migisita_y+4{
			select_hani=1
			select_ten=1
		}
		pmx=mx
		pmy=my
		mx=ginfo(0)-ginfo(4)-3			//}EẌʒu擾
		my=ginfo(1)-ginfo(5)-24
		pget mx,my
		|CgPx=ginfo(16)	//+ginfo(17)+ginfo(18)
		
		if select_hani=1{
			if select_ten=0{
				hidariue_x += mx-pmx
				hidariue_y += my-pmy
			}
			if select_ten=1{
				migisita_x += mx-pmx
				migisita_y += my-pmy
			}
		}
		pos 0,0:color 0,0,0
		gcopy 2,0,0,AviSizeX,AviSizeY
		pos hidariue_x,hidariue_y-22
		if =0:mes "͔͈"
		if =1:mes "ROI"
		line migisita_x,hidariue_y, hidariue_x,hidariue_y
		line migisita_x,migisita_y
		line hidariue_x,migisita_y
		line hidariue_x,hidariue_y
		boxf hidariue_x-4,hidariue_y-4, hidariue_x+4,hidariue_y+4
		boxf migisita_x-4,migisita_y-4, migisita_x+4,migisita_y+4
		//title "("+hidariue_x+","+hidariue_y+") ("+migisita_x+","+migisita_y+")"
		title "Intensity: "+|CgPx
	
	
		//ʂ̏
		gsel 1
		pos 0,0
		gcopy 3,0,0,HABA,TAKASA
		color 255,255,255
		Vtg=45
		pos 10,Vtg

		if =1: mes "Video duration(sec)"
		Vtg+=55:pos 10,Vtg
		if =1: mes "VideoFPS"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Bin duration(sec)"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Min freeze dur (sec)"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Color threshold(0-255)"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Motion threshold (pixel)"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Analyze FPS"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Analyze pixel density"
		Vtg+=55:pos 10,Vtg
		if =1: mes "Wait(ms)"
		TenmetuCnt++
		if TenmetuCnt>40{	//_ŏ
			TenmetuTrg*=-1
			TenmetuCnt=0
		}
		gsel 0
		redraw 1
		redraw 0
		gsel 1
		redraw 1
		redraw 0
		await 16
		stick st
		if st=32 | StartTrg=1{	//X^[g{^ꂽ
			StartTrg=0
			break
		}
	Loop
	
	xAtariNum=(migisita_x-hidariue_x)/step
	yAtariNum=(migisita_y-hidariue_y)/step
	//dialog ""+xAtariNum,0
	//dialog ""+yAtariNum,0
	
	//=======================================̓[v================================================
	pos 0,0
	repeat ͓搔//rfI[v
		KaisekiFrame = VideoDur*VideoFPS
		ŏt[ = MinFreezeDur*AnalyzeFPS
		BinFrameNum = BinDur*AnalyzeFPS
		FrameStep = int(VideoFPS/AnalyzeFPS)
		//rfI
		cvcloseavi	//avit@C
		cvbuffer 0,1,1	//CVobt@(p1Fobt@[ԍAp2,3Fobt@[TCY)
		if ̓[h=1{
			pX=FolderPath+"\\"+filename2(cnt)
		}
		cvopenavi pX,0	//avit@Cobt@[(p2)ɊJiŕKvj

		t[=0
		̓t[=0
		KaisekiFrameFromStart=0
		t[=0
		A=0
		ddim ,8220	//ebin̖
		dim ,8220	//et[Ŗł̍ŏI 1Ȃ疳
		dim atari,HABA,TAKASA	//̍WɃVOi邩
		dim AtariHenkaHozi,KaisekiFrame/FrameStep		//ωێ
		
		repeat 	//t[[v
			stick st
			if st=128{
				end
			}
			cvgetavi			//CVobt@ɓڰщ摜ۑ
			t[++
			if cnt\FrameStep=0{
				̓t[++
				cvflip 0,0
				cvthreshold CV_THRESH_BINARY,Threshold,255,0	//p1 : Ql^Cv  p2 : 臒l()(50)  p3 : l̉fl()  p4 : CVobt@ID
				gsel 0
				cvgetimg 0			//CVobt@[HSPEBhE։摜]
				
				AtariHenka=0	//ω
				repeat yAtariNum
					ocnt=cnt
					repeat xAtariNum
						pget hidariue_x+cnt*step,hidariue_y+ocnt*step
						iro=ginfo(16)
						if iro=0{	//̓_ꍇ
							if atari(cnt,ocnt)=1{	//Oڰтꍇ
								color 0,255,0
							}
							if atari(cnt,ocnt)=0{	//Oڰт͍Ȃꍇ
								color 255,0,0
								atari(cnt,ocnt)=1
								AtariHenka++	//ωʑ
							}
							pset hidariue_x+cnt*step,hidariue_y+ocnt*step	//vbg
						}
						if iro=255{	//̓_Ȃꍇ
							if atari(cnt,ocnt)=1{	//Oڰтꍇ
								color 0,0,220
								atari(cnt,ocnt)=0
								AtariHenka++	//ωʑ
								pset hidariue_x+cnt*step,hidariue_y+ocnt*step	//vbg
							}
						}
					loop
				loop
		
				AtariHenkaHozi(KaisekiFrameFromStart)=AtariHenka	//ωʂۑ
				if AtariHenka <= 臒l{	//ωsNZ臒lȉ
					A++
				}
				if AtariHenka > 臒l{	//ωsNZ臒l傫ꍇ
					A=0
				}
				if A = ŏt[{
					t[ += ŏt[
				}
				if A > ŏt[{
					t[++
				}
				
				KaisekiFrameFromStart++
				if KaisekiFrameFromStart >= KaisekiFrame/FrameStep{
					break
				}
				if =0: title "Freeze analyzer Đt[ "+t[
				if =1: title "Freeze analyzer Current frame: "+t[

				gsel 1
				pos 0,0
				gcopy 3,0,0,HABA,TAKASA
				color 255,255,255
				pos 10,10
				if =0: mes "ω: "+AtariHenka
				if =1: mes "Changed area: "+AtariHenka
				pos 10,35
				if =0: mes "t[: "+t[+"/"+̓t[
				if =1: mes "Freeze frame num: "+t[+"/"+̓t[

				gsel 0
				redraw 1
				redraw 0
				gsel 1
				redraw 1
				redraw 0
			
				if SaiseiSpeed!=0{
					await SaiseiSpeed/10
				}
				if SaiseiSpeed=0{
					await 1
				}
			}
		loop
		cvcloseavi	//avit@C
	

		if ̓[h = 0{
			split pX, "\\", PIt@C
			_O(ID)=PIt@C(stat-1)
		}
		if ̓[h = 1{
			_O(ID)=filename2(cnt)
		}
		//oAZoċL
		A=0
		repeat KaisekiFrame/FrameStep
			kcnt=cnt
			if AtariHenkaHozi(cnt) <= 臒l{	//ωsNZ臒lȉ
				A++
			}
			if AtariHenkaHozi(cnt) > 臒l{	//ωsNZ臒l傫ꍇ
				A=0
			}
			if A = ŏt[{	//w肵Aɂߋ̃t[kĖɂ
				repeat  ŏt[
					(kcnt-cnt)=1	//Xɂ̂ڂȂ疳
				loop
			}
			if A > ŏt[{
				(cnt)=1
			}
		loop
		
		repeat KaisekiFrame/FrameStep
			(cnt/BinFrameNum)+=double((cnt))	//eBinɖt[
		loop
		//vZċL
		repeat KaisekiFrame/FrameStep/BinFrameNum
			(cnt)*=double(100)
			(cnt)/=double(BinFrameNum)
			_ݗ(ID)+=""+(cnt)+","
		loop

		repeat KaisekiFrame/FrameStep
			_ω(ID)+=""+AtariHenkaHozi(cnt)+","
		loop
		ID++
	Loop
Loop



*PutInputField
	gsel 1
	Vtg=10
	pos 10,Vtg	:button gosub "Open",*VideoOpen
	pos 80,Vtg	:button gosub "MultiOpen",*VideoMultiOpen
	pos 150,Vtg	:button gosub "Export",*Export
	Vtg+=55
	pos 10,Vtg	:input VideoDur	:Vtg+=55
	pos 10,Vtg	:input VideoFPS	:Vtg+=55
	pos 10,Vtg	:input BinDur	:Vtg+=55
	pos 10,Vtg	:input MinFreezeDur	:Vtg+=55
	pos 10,Vtg	:input Threshold	:Vtg+=55
	pos 10,Vtg	:input 臒l		:Vtg+=55
	pos 10,Vtg	:input AnalyzeFPS	:Vtg+=55
	pos 10,Vtg	:input step			:Vtg+=55
	pos 10,Vtg	:input SaiseiSpeed	:Vtg+=55
	pos 10,Vtg	:button gosub "Start",*Start	:Vtg+=55
	if =0{
		objenable 3,0	//rŒlςȂ悤͗s
		objenable 7,0
		objenable 9,0
	}
	gsel 0
	return
	
*VideoWindowResize
	cvgetinfo AviSizeX,,OVOBJ_INFO_SIZEX
	cvgetinfo AviSizeY,,OVOBJ_INFO_SIZEY
	screen 0,AviSizeX,AviSizeY,0,100,25			//EBhE
	
	if hidariue_x > AviSizeX{	//ROI傫ꍇ
		hidariue_x = AviSizeX-10
		if hidariue_x < 5{
			hidariue_x = 5
		}
	}
	if hidariue_y > AviSizeY{
		hidariue_y = AviSizeY-10
		if hidariue_y < 5{
			hidariue_y = 5
		}
	}
	if migisita_x > AviSizeX{
		migisita_x = AviSizeX-10
		if migisita_x < 20{
			migisita_x = 20
		}
	}
	if migisita_y > AviSizeY{
		migisita_y = AviSizeY-10
		if migisita_y < 20{
			migisita_y = 20
		}
	}
	
	return

*VideoCueing
	gsel 0
	cls
	cvcloseavi	//avit@C
	cvbuffer 0,1,1	//CVobt@(p1Fobt@[ԍAp2,3Fobt@[TCY)
	cvopenavi pX,0	//avit@Cobt@[(p2)ɊJiŕKvj
	cvgetavi	//AVI擾
	gosub *VideoWindowResize
	
	cvflip 0,0	//摜㉺t](Ȃ㉺܂ɂȂ)
	cvgetimg 0	//摜]
	buffer 2,AviSizeX,AviSizeY,0	//̍ŏ̃t[ێp
	gcopy 0,0,0,1200,600
	gsel 0
	return
	
*VideoOpen
	gsel 0
	dialog "avi", 16, "avit@C"
	if stat != 0{
		pX=refstr
		͓搔=1
		̓[h=0
		gosub *VideoCueing
	}
	return
	
*VideoMultiOpen
	selfolder  FolderPath,"" //
	if stat=0{
		̓[h=1
		screen 6,ob`Iʕ,ob`Iʍ,0,ʍX,ʍY	//t@CIEBhE
		title "Click movie files for the sequence analysis"
		sdim filename,1000,99	//t@Cێp
		sdim filename2,1000,99	//t@Cێpi͏ԁj
		sdim list,1024			//16384
		dirlist list, FolderPath+"\\*.avi",1	//tH_̃t@C擾list֑
		t@C=stat				//t@C
		//dialog str(file_num),0,""
		repeat t@C
			filename2(cnt)=""
		loop
		index=0						//oŏ̈ʒu
		repeat t@C
			getstr filename(cnt),list,index,,	//listsŋ؂ꂽ𔲏o
			index+=strsize			//oindexi߂
		loop
		color 0,0,0
		LUX=30		//t@Cꗗ(filename)c̍W
		LUY=30
		LUX2=620	//t@Cꗗ(filename2)c̍W
		LUY2=30
		repeat t@C	//t@Cꗗ`
			pos LUX,20*cnt+LUY
			mes cnt+1
			pos LUX+20,20*cnt+LUY
			mes filename(cnt)
		
			pos LUX2,20*cnt+LUY2
			mes cnt+1
			pos LUX2+20,20*cnt+LUY2
			mes filename2(cnt)
		loop
		ID=0	//݂̏ԁifilename2ł̗vfƂĎgpj
		͓搔=0
		repeat	//t@CIC[v
			repeat t@C
				if filename(cnt)!=""{
					mx=ginfo(0)-ginfo(4)-3				//}EẌʒu擾
					my=ginfo(1)-ginfo(5)-24
					stick st,256
					if st=256{
						if mx>LUX & mx<LUX+300 & my>20*cnt+LUY & my<20*cnt+LUY+20{
							filename2(ID)=filename(cnt)	//Ofilename2Ɏ󂯓n
							ID++
							͓搔++
							filename(cnt)=""
							color 255,255,255
							boxf 0,0,ob`Iʕ,ob`Iʍ
							color 0,0,0
							repeat t@C						//t@Cꗗĕ`
								pos LUX,20*cnt+LUY
								mes cnt+1
								pos LUX+20,20*cnt+LUY
								mes filename(cnt)
		
								pos LUX2,20*cnt+LUY2
								mes cnt+1
								pos LUX2+20,20*cnt+LUY2
								mes filename2(cnt)
							loop
						}
					}
				}
			loop
			
			color 100,100,200
			boxf 20,5,120,25
			pos 60,7
			color 0,0,0
			mes "OK"
			
			color 100,100,200
			boxf 125,5,225,25
			pos 153,7
			color 0,0,0
			mes "Cancel"
			if (st=256 & mx >=20 & my>=5 & mx<=120 & my<=25) | t@C=ID{	//OKꂽ
				A̓[h=1
				A͐=0
				sdim filename,50,99	//t@Cێp
				//screen 6,1200,1000,2,5,5
				screen 6,1200,1000,2,ʍX,ʍY
				
				O=filename2(0)
				pX=FolderPath+"\\"+filename2(0)
				gsel 2
				cls
				cvcloseavi

				gosub *VideoCueing
				
				斢J=0
				break
			}
			if st=256 & mx >=125 & my>=5 & mx<=225 & my<=25{	//Cancelꂽ
				sdim filename,99	//t@Cێp
				sdim filename2,99	//
				screen 6,1200,1000,2,5,5
				break
			}
			redraw 1
			redraw 0
			await 16
		loop
	}
	return
	
*Export
	dialog "",17,
	if stat=1{	
		Result="%Freeze:\n"
		
		Result+="Bin"
		repeat KaisekiFrame/FrameStep/BinFrameNum
			Result+=","+(cnt+1)
		loop
		
		Result+="\n"
		
		repeat ID
			Result+=_O(cnt)+","+_ݗ(cnt)
			Result+="\n"
		loop
		
		Result+="\n\n"
		
		Result+="Magnitude of movement (pixel):\n"
		Result+="Frame"
		repeat KaisekiFrame/FrameStep
			Result+=","+(cnt+1)
		loop
		
		Result+="\n"
		
		repeat ID
			Result+=_O(cnt)+","+_ω(cnt)
			Result+="\n"
		loop
		
		notesel Result
		SavePath=refstr
		SaveName=""
		split SavePath, ".", SaveName
		notesave SaveName+".csv"
	}
	return
	
*Start
	StartTrg=1
	=0
	gosub *Save
	gsel 1
	cls
	gsel 0
	return
	
*Save
	chdir ProgramPath
	bsave "VideoDur.fa",VideoDur
	bsave "VideoFPS.fa",VideoFPS
	bsave "BinDur.fa",BinDur
	bsave "MinFreezeDur.fa",MinFreezeDur
	bsave "ColorThreshold.fa",Threshold
	bsave "MotionThreshold.fa",臒l
	bsave "AnalyzeFPS.fa",AnalyzeFPS
	bsave "AnalysisDensity.fa",step
	bsave "Wait.fa",SaiseiSpeed
	bsave "ULX.fa",hidariue_x
	bsave "ULY.fa",hidariue_y
	bsave "BRX.fa",migisita_x
	bsave "BRY.fa",migisita_y
	return
	
*Exit
	gosub *Save
	end